package com.wms.service.impl;

import com.wms.entity.*;
import com.wms.mapper.OutboundMapper;
import com.wms.service.OutboundService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @Author Ayases
 * @Date 2025/5/5 16:16
 * @Desc
 */

@Service
public class OutboundServiceImpl implements OutboundService {

    @Autowired
    private OutboundMapper mapper;

    @Override
    public List<OutboundVO> findAll(OutboundDTO outboundDTO) {
        return mapper.findAll(outboundDTO);
    }

    @Override
    public void deleteOne(String outboundId) {
        mapper.deleteOne(outboundId);
    }

    @Override
    public void deleteBatch(String[] selectedIds) {
        for (String id : selectedIds) {
            mapper.deleteOne(id);
        }
    }

    @Override
    public void pick(String outboundId) {
        mapper.pick(outboundId);
    }

    @Override
    public void confirm(String outboundId) {
        mapper.confirm(outboundId);
    }

    @Override
    public void pickBatch(String[] selectedIds) {
        for (String id : selectedIds) {
            mapper.pick(id);
        }
    }

    @Override
    public void confirmBatch(String[] selectedIds) {
        for (String id : selectedIds) {
            mapper.confirm(id);
        }
    }

    @Override
    public List<OutboundVO> searchRelateData(String outboundId) {
        return mapper.searchRelateData(outboundId);
    }

    @Override
    @Transactional
    public void saveDialogForm(SaveDialogFormDTO dto) {
        if (dto.getFunctionSelect().equals("insert")) {
            // 1. 插入主订单
            mapper.insertOutboundOrder(dto);
            // 2. 插入物流信息
            mapper.insertOutboundLogistics(dto);
            // 3. 批量插入商品信息
            dto.getGoodsList().forEach(item -> {
                mapper.insertOutboundProducts(item);
            });
            // 4. 批量插入关联关系
            dto.getGoodsList().forEach(item -> {
                mapper.insertOutboundRelation(dto.getOutboundId(), item.getProductId(), dto.getLogisticsId());
            });
        } else if (dto.getFunctionSelect().equals("update")) {
            /**
             * 对于更新操作，因为不确定更新后的数据中的商品单数量是否增加或者减少
             * 因此，不确定对商品订单使用update还是delete或则insert操作
             * 方便起见，干脆先删除所有信息再重新插入，这样就不用考虑上面提到的问题
             * 更新主订单信息（因为订单号不变，所以可以直接更新，同时可以把订单的创建时间保留）
             * 删除其他信息（物流信息、商品信息、关联关系）
             * 插入新的信息（物流信息、商品信息、关联关系）
             * -------------------------注意-----------------------
             * 由于个表之间存在外键约束，所以删除时要注意先删除关联关系再删除其他信息，否则会报错
             * 这里按关联表，物流表，商品表的顺序删除，最后更新主订单信息
             */
            // 1. 删除其他信息
            dto.getGoodsList().forEach(item -> {
                mapper.deleteOutboundRelation(dto.getOutboundId(), item.getProductId(), dto.getLogisticsId());
            });//先删除关联关系
            mapper.deleteOutboundLogistics(dto);//再删除物流信息
            dto.getGoodsList().forEach(item -> {
                mapper.deleteOutboundProducts(item);
            });//最后删除商品信息
            mapper.updateOutboundOrder(dto);//更新主订单信息

            // 2. 插入新的信息
            mapper.insertOutboundLogistics(dto);
            dto.getGoodsList().forEach(item -> {
                mapper.insertOutboundProducts(item);
            });
            dto.getGoodsList().forEach(item -> {
                mapper.insertOutboundRelation(dto.getOutboundId(), item.getProductId(), dto.getLogisticsId());
            });

        }

    }


    @Override
    public SaveDialogFormDTO getDetailByOutboundId(String outboundId) {
        // 1. 查询出库单主信息
        OutboundOrder order = mapper.selectOutboundOrderById(outboundId);
        if (order == null) {
            throw new RuntimeException("出库单不存在");
        }

        // 2. 填充基础信息到DTO
        SaveDialogFormDTO dto = new SaveDialogFormDTO();
        dto.setOutboundId(order.getOutboundId());
        dto.setRelatedOrderId(order.getRelatedOrderId());
        dto.setShipperName(order.getShipperName());
        dto.setWarehouse(order.getWarehouse());
        dto.setStatus(order.getStatus());
        dto.setOutboundType(order.getOutboundType());
        dto.setRemark(order.getRemark());

        // 3. 处理日期字段转换
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        dto.setCreateTime(order.getCreateTime() != null ? sdf.format(order.getCreateTime()) : null);
        dto.setOutboundTime(order.getOutboundTime() != null ? sdf.format(order.getOutboundTime()) : null);

        // 4. 查询物流信息
        String logisticsId = mapper.selectLogisticsIdByOutboundId(outboundId);
        if (logisticsId != null) {
            OutboundLogistics logistics = mapper.selectLogisticsById(logisticsId);
            if (logistics != null) {
                dto.setLogisticsCompany(logistics.getCompany());
                dto.setLogisticsId(logistics.getLogisticsId());
                dto.setFreight(logistics.getFreight());
            }
        }

        // 5. 查询商品列表并设置
        List<SaveDialogFormDTO.GoodsItem> goodsItems = mapper.selectProductsByOutboundId(outboundId);
        dto.setGoodsList(goodsItems);

        return dto;
    }


}
